/********************************************************
*Implementacion de Lista de comandos de 3 direcciones   *
*Author     :   Simon Emmanuel Gutierrez Brida          *
*Version    :   0.1                                     *
*Fecha      :   Octubre/2011                            *
*------------------------------------------------------ *
*********************************************************/

#include <stdlib.h>
#include <stdio.h>
#include "listac3d.h"

ListaC3D* nuevaListaC3D() {
    ListaC3D *nueva = (ListaC3D*) malloc(sizeof(ListaC3D));
    nueva->inicio = NULL;
    nueva->longitud = 0;
    return nueva;
}

Com3D* obtener_listaC3D(ListaC3D *lista, int index) {
    NodoC3D *runner = lista->inicio;
    bool validIndex = (index >= 0) && (index < longitud_listaC3D(lista));
    if (validIndex) {
        int i = 0;
        while (i < index) {
            runner = obtenerSiguiente_nodoC3D(runner);
            i++;
        }
        return obtenerInfo_nodoC3D(runner);
    } 
}

int longitud_listaC3D(ListaC3D *lista) {
    return lista->longitud;
}


void agregar_listaC3D(ListaC3D *lista, Com3D *elem, int index) {
    bool validIndex = (index >= 0) && (index <= longitud_listaC3D(lista));
    if (validIndex) {
        if (index == 0) {
            NodoC3D *nuevo = nuevoNodoC3D_info_siguiente(elem, lista->inicio);
            lista->inicio = nuevo;
        } else {
            int i = 0;
            NodoC3D *runner = lista->inicio;
            while (i < (index - 1)) {
                runner = obtenerSiguiente_nodoC3D(runner);
                i++;
            }
            NodoC3D *nuevo = nuevoNodoC3D_info_siguiente(elem, obtenerSiguiente_nodoC3D(runner));
            definirSiguiente_nodoC3D(runner, nuevo);
        }
        lista->longitud = longitud_listaC3D(lista) + 1;
    }
}


void eliminar_listaC3D(ListaC3D *lista, int index) {
    bool validIndex = (index >= 0) && (index < longitud_listaC3D(lista));
    if (validIndex) {
        NodoC3D *runner = lista->inicio;
        NodoC3D *elim = lista->inicio;
        if (index == 0) {
            lista->inicio = obtenerSiguiente_nodoC3D(lista->inicio);
        } else {
            int i = 0;
            while (i < (index - 1)) {
                runner = obtenerSiguiente_nodoC3D(runner);
                i++;
            }
            elim = obtenerSiguiente_nodoC3D(runner);
            definirSiguiente_nodoC3D(runner, obtenerSiguiente_nodoC3D(obtenerSiguiente_nodoC3D(runner)));
        }
        free(elim);
        lista->longitud = longitud_listaC3D(lista) - 1;
    }
}